home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / assembly / new_line.lha / new_line!.s < prev    next >
Encoding:
Text File  |  1992-09-02  |  3.8 KB  |  196 lines

  1. ; *******************************************
  2. ; * This is one of the fastes Line-Routine. *
  3. ; * At the moment without clipping.        *
  4. ; *******************************************
  5. ;
  6. ;
  7. ; This Sources is done by MCM/Complex and improved by Tron/Sanity
  8. ;
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.     org    $20000
  16.     load    $20000
  17.  
  18. WaitBlit    MACRO
  19. .\@1    BTST    #14,2(A5)
  20.     BNE.S    .\@1
  21.         ENDM
  22.  
  23. Plane    =    $50000
  24.  
  25. J:
  26.     move.l    #More,$80.W
  27.     trap    #0
  28.     rts
  29.  
  30. MORE:
  31.     move.w    #$2700,sr
  32.     lea    $DFF000,A5
  33.     bsr    clear
  34.     bsr    InitBlitSizes
  35.     bsr    InitYPosTab
  36.     move.l    #ucp,$84(a5)
  37.     bsr    InitLine
  38.  
  39.     lea    Plane,A0
  40.     move    #0,d0
  41.     move    #0,d1
  42.     move    #100,d2
  43.     move    #100,d3
  44.     bsr    BlitLine
  45.     
  46. Wait:
  47.     btst    #2,$16(a5)
  48.     bne.s    Wait
  49.  
  50.     move.w    #$2000,sr
  51.     rte
  52.  
  53. Clear:
  54.     lea    Plane,a0
  55.     move.w    #101*40/4-1,d1
  56.     moveq    #0,d0
  57. Clear0:
  58.     move.l    d0,(a0)+
  59.     dbf    d1,Clear0
  60.  
  61.     move.w    #156*40/4-1,d1
  62. *    move.l    #$AAAAAAAA,d0
  63. Clear1:
  64.     move.l    d0,(a0)+
  65.     dbf    d1,Clear1
  66.     rts
  67.     
  68. UCP:
  69.     dc.w    $96,$87C0,$108,0,$8e,$2981,$90,$29c1,$92,$38,$94,$d0
  70.     dc.w    $e0,Plane/$10000,$e2,Plane&$FFFF,$100,$1200,$102,0
  71.     dc.l    $fffffffe
  72.     
  73. InitBlitSizes:
  74.     LEA    LINE_BlitSizes(PC),A0
  75.     MOVEQ    #0,D0
  76.     MOVE.W    #$3FF,D2
  77. .loop
  78.     MOVE    D0,D1
  79.     LSL.W    #6,D1
  80.     ADDQ.W    #2,D1
  81.     MOVE    D1,(A0)+
  82.     ADDQ.W    #1,D0
  83.     DBF    D2,.loop
  84.     RTS
  85.     
  86. InitYPosTab:
  87.     LEA    YPosTab(PC),A0
  88.     MOVEQ    #0,D0
  89.     MOVE.W    #255,D1
  90. .loop
  91.     MOVE    D0,(A0)+
  92.     ADD.W    #40,D0
  93.     DBF    D1,.loop
  94.     RTS
  95.  
  96. InitLine:
  97.     WaitBlit
  98.     MOVEQ    #-1,D0
  99.     MOVE.L    D0,$44(A5)        ;BLTAFWM = $FFFF (BLTALWM egal!)
  100.     MOVE.L    #$FFFF8000,$72(A5)    ;BLTBDAT = Maske, BLTADAT = $8000
  101.     MOVE.W    #$0028,$60(A5)        ;BLTCMOD = Breite der Plane
  102.     MOVE.W    #0,$42(A5)        ;BLTCON1 löschen
  103.     LEA    YPosTab(PC),A1
  104.     LEA    LINE_BlitSizes(PC),A2
  105.     RTS
  106.  
  107. *-------------------------------- BlitLine -----------------------------*
  108. *
  109. *    IN:    D0/D1        x1,y1
  110. *        D2/D3        x2,y3
  111. *        A0        Plane
  112. *        A1    (*)    YPosTab
  113. *        A2    (*)    LINE_BlitSizes
  114. *        A5    (*)    Custom-Base $DFF000
  115. *
  116. *        D4        work register
  117. *
  118. *        (*)        will remain untouched
  119. BlitLine:
  120.     CMP.W    D1,D3        ;Blitter im Single-Modus
  121.     BEQ.S    .end        ;--> Keine horizontalen Linien!!!
  122.     BGT.S    .y2_gt_y1    ;Y2 > Y1 ??? Ja --> branch
  123.     EXG    D0,D2        ;Nein --> Oktanten "klappen"
  124.     EXG    D1,D3        ;--> Nur Oktanten 4,5,6,7 möglich!!!
  125. .y2_gt_y1
  126.     MOVE    D1,D4
  127.     ADD    D4,D4
  128.     ADD.W    (A1,D4.W),A0
  129.     MOVE    D0,D4
  130.     ASR.W    #3,D4
  131.     LEA    (A0,D4.W),A0
  132.  
  133.     MOVEQ    #1,D4        ;Oktant 6/7
  134.     SUB    D0,D2        ;X2 > X1 (DeltaX)
  135.     BPL.S    .x2_gt_x1    ;DeltaX positiv --> Oktant 6/7
  136.     NEG    D2        ;DeltaX negativ --> Positiv machen
  137.     MOVEQ    #0,D4        ;jetzt nur noch Oktanten 4/5 möglich!!! 
  138. .x2_gt_x1
  139.     SUB    D1,D3        ;DeltaY
  140.  
  141.  
  142.     MOVE    D3,D1
  143.     ADD    D1,D1
  144.     CMP.W    D2,D1
  145.     DBHI    D3,.1
  146. .1
  147.     MOVE    D3,D1        
  148.     SUB    D2,D1        ;DeltaY > Delta X ??? (SUB.W wegen X-Flag!!!!)
  149.     BGT.S    .dy_gt_dx    ;Ja --> D3 schon GDelta und D2 KDelta
  150.     EXG    D2,D3        ;Nein -> D3 zu GroßDelta, D2 zu KDelta machen
  151. .dy_gt_dx
  152.     ADDX    D4,D4        ;D4 mit D4 und X-Flag addieren
  153.         ;bei Oktant 4/5 (D4=0) und dy>dx -> X-Flag=0 -> D4=0 OKT 5
  154.         ;bei Oktant 4/5 (D4=0) und dy<dx -> X-Flag=1 -> D4=1 OKT 4
  155.         ;bei Oktant 6/7 (D4=1) und dy>dx -> X-Flag=0 -> D4=2 OKT 6
  156.         ;bei Oktant 6/7 (D4=1) und dy<dx -> X-Flag=1 -> D4=3 OKT 7
  157.  
  158.     ADD    D2,D2        ;2*KDelta
  159.     MOVE    D2,D1        
  160.     SUB    D3,D2        ;2*KDelta - GDelta
  161.     ADDX    D4,D4        ;wenn 2*KDelta - GDelta <0 --> SIGN-Bit setzen!
  162.  
  163.     ADD    D0,D0
  164.     ANDI.W    #$001F,D0
  165.  
  166.     WaitBlit
  167.     MOVE    BltCon0(PC,D0.W),$40(A5)    ;BltCON0 = $xB4A
  168.     MOVE.B    BltCon1(PC,D4.W),$43(A5)    ;BltCON1 = $00xx
  169.     
  170.     MOVE    D2,$52(A5)    ;BLTAPTL = 2*KDelta - GDelta    
  171.     SUB    D3,D2        ;D2 = 2*KDelta - 2*GDelta
  172.     ADD    D3,D3
  173.     MOVEM.W    D1/D2,$62(A5)    ;BLTBMOD=2*KDelta, BLTAMOD=2*KDelta-2*GDelta
  174.     MOVE.L    A0,$48(A5)
  175.     MOVE.L    A0,$54(A5)
  176.     MOVE    (A2,D3.W),$58(A5)    
  177. .end
  178.     rts
  179.  
  180. BltCon0:
  181.     DC.W    $0B4A,$1B4A,$2B4A,$3B4A,$4B4A,$5B4A,$6B4A,$7B4A
  182.     DC.W    $8B4A,$9B4A,$AB4A,$BB4A,$CB4A,$DB4A,$EB4A,$FB4A
  183. BltCon1:
  184.     DC.B    $0B    ;Sign 0, Oktant 5, Single, Line
  185.     DC.B    $4B    ;Sign 1, Oktant 5, Single, Line
  186.     DC.B    $17    ;Sign 0, Oktant 4, Single, Line
  187.     DC.B    $57    ;Sign 1, Oktant 4, Single, Line
  188.     DC.B    $03    ;Sign 0, Oktant 6, Single, Line
  189.     DC.B    $43    ;Sign 1, Oktant 6, Single, Line
  190.     DC.B    $13    ;Sign 0, Oktant 7, Single, Line
  191.     DC.B    $53    ;Sign 1, Oktant 7, Single, Line
  192.  
  193. LINE_BlitSizes:        BLK.W    1024,0
  194. YPosTab:        BLK.W    256,0
  195.